import Vue from 'vue'

import 'normalize.css/normalize.css' // A modern alternative to CSS resets

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import locale from 'element-ui/lib/locale/lang/en' // lang i18n

import '@/styles/index.scss' // global css

import App from './App'
import store from './store'
import router from './router'

import '@/icons' // icon
import '@/permission' // permission control

// set ElementUI lang to EN
Vue.use(ElementUI, { locale })
// 如果想要中文版 element-ui，按如下方式声明
// Vue.use(ElementUI)

Vue.config.productionTip = false

// 自定义指令演示
Vue.directive('fiximg', {
  // 配置对象当中创建对应钩子函数
  // inserted 是元素插入父节点会被执行
  inserted(el, option) {
    console.log('元素插入节点', option)
    // 每个钩子, 接收到第一个参数就是元素本身
    // 第二个参数, 是当前指令的属性对象
    el.addEventListener('error', () => {
      el.src = option.value
    })

    // 上面的逻辑有一个缺陷, 只能监听错误事件
    // 但是如果图片本身不存在 src 也就不会触发错误事件
    el.src = el.src || option.value
  },
  componentUpdated(el, option) {
    // 每次这个元素数据发生更新之后, 都需要检查一遍是否为空
    // 如果是则修复
    el.src = el.src || option.value
  }
})

// 全局组件的注册办法
// import PageTools from '@/components/PageTools'
// Vue.component('PageTools', PageTools)
// 通过安装插件的方式, 实现组件的注册
import MyComponents from '@/components'
Vue.use(MyComponents)

// 过滤器全局注册
// 1. 函数
// function formatDate(oldVal) {
//   return oldVal.split('T')[0]
// }
// import {formatDate} from '@/filters'
// 2. 注册
// Vue.filter('formatDate', formatDate)

// 批量注册过滤器的方法
// 1. 将一个文件里面的所有函数全部引入
import * as myFilters from '@/filters'
// console.log(myFilters)
// 2. forin 循环遍历对象的 key 逐个进行注册
for (const key in myFilters) {
  Vue.filter(key, myFilters[key])
}

// 全局混入写法
import myMixin from '@/mixin'
Vue.mixin(myMixin)

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})
